<?php

namespace app\common\util;

use think\facade\Db;

class MySqlUtil
{
    /**
     * 距离field
     *
     * @param string $alias 数据库查询别名
     * @param string $distanceField 距离字段别名
     *
     * @return \think\Db\Raw
     */
    public static function distanceField($alias = null, $distanceField = 'distance')
    {
        $lng = input('lng');
        if (!$lng) {
            $lng = 113.722;
        }
        $lat = input('lat');
        if (!$lat) {
            $lat = 25.0211;
        }
        $aliasLng = $alias ? "$alias.lng" : 'lng';
        $aliasLat = $alias ? "$alias.lat" : 'lat';
        return Db::raw("ST_Distance_Sphere( POINT($aliasLng, $aliasLat), POINT({$lng}, {$lat}) ) as {$distanceField}");
    }

    /**
     * 生成mysql json_contains https://mariadb.com/kb/en/json_contains/
     *
     * @param string $field 字段名
     * @param mixed $value 条件值
     * @param ?string $alias 数据库别名
     *
     * @return \think\Db\Raw
     */
    public static function jsonArrayContain($field, array|string|int|null $value, $alias = null)
    {
        if (!$value) {
            return Db::raw('1=1');
        }
        $alias = $alias ? $alias . '.' : '';
        $search = '';
        if (is_array($value) || $value instanceof \Traversable) {
            $sqlJsonArray = json_encode($value);
            $search = "'$sqlJsonArray'";
        } else {
            $search = "'$value'";
        }
        return Db::raw("JSON_CONTAINS({$alias}$field, $search)");
    }
}
